package com.cskaoyan.javase.method._0introduction;

/**
 * 引例，现在有三个需求：
 * 编写程序，计算10+20，并输出结果
 * 编写程序，计算111+222，并输出结果
 * 编写程序，计算333+444，并输出结果
 * 请问这个程序有哪些缺点呢？
 *
 * 很明显：
 *
 * 这个程序中有大量的代码是重复的，是可以被复用的，是可以优化的。
 * 方法的本质是为了复用代码.
 * 为了解决这个需求，我们就需要方法这种语法机制，这意味着方法（method）至少应该解决我们以下三个痛点：
 *
 * 能够重复实现某种特定功能，解决同一类问题，而不需要重复写代码。
 * 每次实现这个功能时，可以传入不同的数据。
 * 传入数据实现功能后，能够得到不同的结果。
 * 核心需求就是，能复用代码，有输入和输出。这实际上就是方法的作用。与此同时，我们还把使用 方法去实现某种特定功能的过程叫做方法的调用（invoke）。
 *
 *
 * 使用方法来复用代码,解决以上:求两个int类型数值之和的问题
 *
 * 方法的语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 *   //方法体
 * }
 * 在熟悉方法的语法之前,我们先记住两个概念:
 *      1.方法头,指的是" [修饰符列表] 返回值类型 方法名 (形式参数列表)"组成的部分,也叫方法的声明
 *      2.方法的签名,指的是可以唯一的确定一个方法的组成部分,指的是:"方法名 (形式参数列表)"
 *
 * 逐一解释方法的语法:
 *      1.[修饰符列表]: 指的是能够修饰方法的修饰符组成的列表,能够修饰方法的修饰符可以有很多
 *          但是现在我们没学,默认方法的修饰符列表是public static
 *          并且修饰符列表是完全可以省略的,就是可以什么都不写,空着
 *
 *      2.返回值类型: 返回值的数据类型,可以是基本数据类型,也可以是引用数据类型
 *          返回值: 一次方法调用实现功能后,可能会给出一个结果,这个结果就是返回值
 *          返回值类型对于一般的方法来说,必须要写,不能没有返回值类型
 *
 *      3.方法名: 是一个标识符,应该使用"小驼峰式的命名"规范,而且方法一般都是做操作,所以方法名尽量用动词
 *          而且应该尽量使用合法的英文,最好"见名知意"
 *          获取最大值的方法: getMaxValue
 *          方法名不要害怕起的很长,要尽量表达清楚方法的作用
 *          方法也不能没有方法名
 *
 *      4.形式参数列表: 形式组成的列表
 *          形式参数: 方法每次实现功能时，可以传入不同的数据。那么
 *              这个方法需要传入什么类型数据呢?需要几个数据呢?需不需要数据传入呢?
 *              如何在方法中使用这个参数呢?
 *              这些问题,都是由形式参数回答的
 *              所以形式参数的语法:
 *              数据类型 变量名
 *
 *              形式参数,简称形参,它是一个"形式",不是一个真的参数
 *              它其实是一个占位符
 *
 *              在方法被调用时,具体传入方法的参数,叫做"实际参数",是一个真正的数据,真正的参数
 *              方法可以允许不传参数,方法可以没有形参列表,可以为空
 *
 *      5.方法体,方法实现功能,需要执行的代码.方法体可以为空,可以什么都不写.
 *
 * 以上就是方法的语法,语法讲完了,接下来开始定义方法.
 * 方法的定义位置,方法在哪里定义?
 *      Java的方法必须定义在类体中,其他方法之外,方法不能嵌套定义
 *
 *  一个方法如果在返回值类型的地方,明确了方法需要返回一个数值,那么必须使用:
 *       return + (表达式,值);
 *       表示这个方法的返回值
 *
 * 方法定义完后,就需要调用方法.
 * main方法是程序的入口方法,java中的所有方法要么直接在main方法中调用执行,要么间接调用
 * 方法不调用不执行.
 *
 * 在同一个类中,对于有static修饰的方法,在main方法中可以直接方法名(实参列表)去调用某个方法
 *
 * 对于有返回值的方法,操作它的方法调用,就是操作该方法调用的返回值!!!
 *
 * 注意事项:
 *      1.Java中方法之间是平行的关系,方法定义的位置,和方法的调用结果没有影响
 *      2.必须定义在类体中（实际上对于Java而言，几乎所有代码都必须写在类体中）其它方法的外部。方法不能嵌套定义。
 *
 * @since 10:50
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        // Result of 'NewDemo.sum()' is ignored
        int sumValue = sum(10, 20);
        System.out.println(sumValue);

        int a = 1;
        int b = 1;
        int sumValue2 = sum(a, b);
        System.out.println(sumValue2);

        System.out.println(sum(10, 10));

        System.out.println(sum(100, 100) + 100);
    }

    // 定义方法,实现求两个int类型数值的和
    public static int sum(int num1, int num2) {
        // Local variable 'sumValue' is redundant
        // int sumValue = num1 + num2;
        // Missing return statement
        // return sumValue;
        return num1 + num2;
    }
}
